我們前面提到了dotnet core運用了很多的Builder Pattern
來建立物件
Configuration 也是其中之一
最後我們在用的Config主要是由三個物件所組成的
他們之間的關係大Guy 4醬
一個IConfigurationBuilder
可能有多組來源
最後會透過Buildy組出成一個IConfiguration
舉例而言,dotnet framework 中常用的設定檔web.config跟app.config這種xml格式的config
可以透過加一個 XmlConfigurationSource
就可以跟 dotnet core 的appsetting 一起使用
IConfiguration
本身是一個樹狀的結構
以json類型的Config為例appsettings.json
{
"line": {
"channelId": "line_channel_id",
"channelSecret": "line_channel_secret",
"info": {
"name": "line_bot_name",
"pictureUrl": "line_bot_picture_url"
}
},
"facebook": {
"pageId": "facebook_page_id",
"accessToken": "facebook_page_access_token",
"appSecret": "facebook_app_secret"
},
"telegram": {
"botToken": "telegram_bot_token"
}
}
對應的IConfiguration
結構長的會像
當我們想要取 line 的 ChannelId時
可以透過 下面的方式取
IConfiguration configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
var channelId = configuration["line:channelId"];
我們建立了一個ConfigurationBuilder的物件,並且透過了AddJsonFile
加入了一個IConfigurationSource
最後透過Build方法取得IConfiguration
不過我想針對的重點是在line:channelId
就像上面畫的IConfiguration.cs
是個樹狀結構
我們透過這個 :
來表達階層的概念
要取得line 的 name line -> info -> name line:info:name
我們在上圖有看到樹的根是一個IConfigurationRoot
的物件IConfigurationRoot
本身繼承了 IConfiguration
的介面
裡面有一個比較重要的方法void Reload()
當這個方法被呼叫的時候,整棵樹會被刷新,所有tree 的資料會被刷新。
上面圖非根的節點
IConfigurationSection.cs
public interface IConfigurationSection : IConfiguration
{
/// <summary>
/// Gets the key this section occupies in its parent.
/// </summary>
string Key { get; }
/// <summary>
/// Gets the full path to this section within the <see cref="IConfiguration"/>.
/// </summary>
string Path { get; }
/// <summary>
/// Gets or sets the section value.
/// </summary>
string Value { get; set; }
}
:
分隔,代表當前節點在樹中的位置,ex info 的 Path就是 line:info
facebook:pageId
的值為facebook_page_idline:info
的值為null當IConfigurationRoot
的Reload被呼叫時,所有IConfigurationSection
的value會被重設